大規模学力調査の二次分析
(基本編)

川口 俊明

目的

  • PISAやTIMSSの二次分析に必要な基礎知識のレクチャー
  • 学会プロジェクト1に関する対面での質疑応答

資料

使うもの

大規模学力調査とは?

  • Large Scale Assessment in Education: LSA

LSAを理解する4つのポイント

  • Sampling Weight: 第9章
  • Replication Method: 第10章
  • Item Response Theory: 第11章
  • Plausible Values: 第12章

LSAを分析するには?

  • R: いろいろ便利かつ無償(!)
  • intsvy: Rのパッケージ。PISA・TIMSS・PIAACなどに対応

とりあえずR on Colab

  • Rは環境構築が難しい・・・
    • 人によってハマりポイントが違うのでコメントが大変
  • Colab上でRを使えば皆一緒!

R on Colabの使い方

  • 第2章を見ながら作業してみよう!
  • Google Driveに"RforLSA.ipynb"をアップロードしても可

Colabの事前準備

  • すべてのコマンドを実行可能にする「おまじない」
    • ファイルの一番上に記載して実行しよう
# R on Colabにいろいろパッケージをダウンロード
system("curl -L -o library.tar.gz https://github.com/kawa5902/LSAdata/raw/refs/heads/main/202502library.tar.gz")
# 解凍
system("tar -xzf /content/library.tar.gz -C /content")
.libPaths("library")

# 日本語フォント(文字化け対策)
system("apt-get -y install fonts-ipafont-gothic")
  • 後は各章のコードを上から順にコピペすれば動きます!
    • 途中を飛ばすと動かないことがあります

標本ウェイト

Table 1: 標本抽出の例(各校から20人)
学校名 生徒数 平均点 抽出確率 標本ウェイト
A校 150人 50点 \(\frac{20}{150}\) \(\frac{150}{20}=7.5\)
B校 100人 60点 \(\frac{20}{100}\) \(\frac{100}{20}=5.0\)
C校 50人 70点 \(\frac{20}{50}\) \(\frac{50}{20}=2.5\)
D校 20人 80点 \(\frac{20}{20}\) \(\frac{20}{20}=1.0\)
全体 320人 ?点

★全体の平均点をどうやって計算する?

(50 + 60 + 70 + 80) / 4 # 間違い
[1] 65
# 標本ウェイトっぽく
(50 * 7.5 * 20 + 60 * 5 * 20 + 70 * 2.5 * 20 + 80 * 1 * 20) / 320
[1] 58.125

Replication Method

  • LSA≠単純な無作為抽出(Simple random sampling:SRS)
    • 同じ学校の生徒は似ている(≒標準誤差の過小推定)
    • 有限母集団(≠無限母集団)
    • 非復元抽出(≠復元抽出)

⇒ 母集団の推定が(超)面倒くさい

  • 標本からのリサンプリングによる標準誤差の推定
    • BRR: Balanced Repeated Replication (PISA)
    • JK: JackKnife (TIMSS)

Item Response Theory

  • CTTの課題: 受検者の能力とテストの難易度が不可分
  • IRT: 個々の項目に難易度があるという発想
    • 同じ難易度の項目なら相互に入れ替え可能
    • 異なる項目から同じ難易度のテストを作成できる!

一般的なIRTの推定法

  • 最初に項目パラメータ推定,続いて受検者の能力推定
    • それぞれ複数のモデル・手法が存在する
    • 詳しく知る必要はないが,能力推定法に注意が必要

IRTの能力推定法の課題

  • MLEにせよEAPにせよ,母集団の推定に偏りが生じる
  • 対策として,Plausible Values
    • 受検者の能力分布から無作為に抽出した値
    • Multiple Imputationの応用
  • 素のPVsにはいろいろ問題あり
    • 母集団情報で「条件付ける」必要がある
    • LSAのデータセットにあるのは条件づけたPVs
  • PVsの利用は,Rubinのルールでだいたいok

処理を自動化するintsvy

# データの読み込み
url <- "https://raw.githubusercontent.com/kawa5902/LSAdata/refs/heads/main/pisa2012stuJPN.csv"
jpn2012 <- read.csv(url)

# ESCSの欠測をNAに変換
jpn2012$ESCS[jpn2012$ESCS == 9999] <- NA

# ESCSの平均値
intsvy::pisa.mean(variable = "ESCS", data = jpn2012)
  Freq        Mean       s.e.        SD         s.e
1 6185 -0.07151303 0.01524119 0.7036702 0.007597166
# 度数分布
intsvy::pisa.table(variable = "ST03Q01", data = jpn2012)
   ST03Q01 Freq Percentage Std.err.
1        1  521       8.20     0.36
2        2  456       7.27     0.38
3        3  501       7.89     0.38
4        4  532       8.30     0.36
5        5  533       8.43     0.34
6        6  521       8.07     0.30
7        7  574       9.00     0.40
8        8  560       8.94     0.36
9        9  541       8.56     0.43
10      10  547       8.64     0.32
11      11  510       7.98     0.38
12      12  555       8.72     0.38
# 男女別に出力する場合はbyに指定
intsvy::pisa.mean(variable = "ESCS", by = "ST04Q01", data = jpn2012)
  ST04Q01 Freq        Mean       s.e.        SD         s.e
1       1 2974 -0.07228828 0.02079859 0.7075644 0.010526624
2       2 3211 -0.07079883 0.01925711 0.7001372 0.008863656
intsvy::pisa.table(variable = "ST03Q01", by = "ST04Q01", data = jpn2012)
   ST04Q01 ST03Q01 Freq Percentage Std.err.
1        1       1  263       8.73     0.51
2        1       2  225       7.60     0.51
3        1       3  226       7.48     0.49
4        1       4  249       8.11     0.48
5        1       5  268       9.00     0.49
6        1       6  247       7.97     0.42
7        1       7  263       8.57     0.58
8        1       8  264       8.78     0.49
9        1       9  249       8.40     0.62
10       1      10  275       9.16     0.50
11       1      11  226       7.43     0.47
12       1      12  266       8.76     0.51
13       2       1  258       7.73     0.49
14       2       2  231       6.97     0.46
15       2       3  275       8.25     0.49
16       2       4  283       8.47     0.46
17       2       5  265       7.92     0.48
18       2       6  274       8.15     0.45
19       2       7  311       9.38     0.51
20       2       8  296       9.08     0.50
21       2       9  292       8.70     0.50
22       2      10  272       8.17     0.51
23       2      11  284       8.49     0.49
24       2      12  289       8.69     0.52
# 相関係数
intsvy::pisa.rho(variables = c("PV1READ", "PV1MATH", "ESCS"), data = jpn2012)
        PV1READ Rho PV1READ s.e. PV1MATH Rho PV1MATH s.e. ESCS Rho ESCS s.e.
PV1READ       1.000        0.000       0.861        0.006    0.289     0.024
PV1MATH       0.861        0.006       1.000        0.000    0.320     0.025
ESCS          0.289        0.024       0.320        0.025    1.000     0.000
attr(,"class")
[1] "intsvy.rho" "matrix"     "array"     
# PVsを使った平均値の推定
intsvy::pisa.mean.pv(pvlabel = paste0("PV", 1:5, "MATH"), data = jpn2012)
  Freq   Mean s.e.    SD  s.e
1 6351 536.41 3.59 93.52 2.19
# PVsを使った平均値の推定 by 男女別
intsvy::pisa.mean.pv(
  pvlabel = paste0("PV", 1:5, "MATH"), by = "ST04Q01", data = jpn2012
)
  ST04Q01 Freq   Mean s.e.    SD  s.e
1       1 3021 527.01 3.59 88.06 2.63
2       2 3330 544.88 4.62 97.41 2.65
# 回帰分析
intsvy::pisa.reg(y = "PV1READ", x = "ESCS", data = jpn2012)
            Estimate Std. Error t value
(Intercept)   543.78       3.32  163.92
ESCS           39.24       3.69   10.63
R-squared       0.08       0.01    5.95
# PVsを使った回帰分析
intsvy::pisa.reg.pv(
  x = "ESCS", pvlabel = paste0("PV", 1:5, "READ"), data = jpn2012
)
            Estimate Std. Error t value
(Intercept)   543.59       3.34  162.58
ESCS           37.99       3.91    9.71
R-squared       0.08       0.01    5.42
# PVsを使った回帰分析(重回帰)
intsvy::pisa.reg.pv(
  x = c("ST04Q01", "ESCS"), pvlabel = paste0("PV", 1:5, "READ"), data = jpn2012
)
            Estimate Std. Error t value
(Intercept)   577.85       5.10  113.30
ST04Q01       -22.53       3.54   -6.36
ESCS           38.00       3.94    9.65
R-squared       0.09       0.01    6.51

全国学力・学習状況調査について

  • 「保護者に対する調査」の標準誤差の算出はJK2法1
  • 「経年変化分析調査」の能力推定法はMLE2(?!)
  • 調査対象学校は,いずれか1教科を実施3(?!)

要するに?

  • 条件づけたPVsで能力を再推定する必要がある
  • Rのsurvey(JK2法), TAMパッケージを組み合わせる
  • SPSSやSTATAだと難しい(気がする)4

川口(2024)『日本テスト学会誌』

応用可能性?

  • 推測だが小学校データにはかなり有効
  • 中学校データには使い勝手悪いかも

川口・垂見『理論と方法』(印刷中)

1

その他の話題

マルチレベルモデルとLSA

  • そもそもデザインベース VS モデルベース
  • 標本ウエイトの扱い ⇒ 正解はない(模様)
  • PVsの扱い ⇒ 基本はRubinのルールでok

欠測処理とPVs

  • すでにPVsがある ⇒ PVごとにPVを含んだMI
  • PVも自分で作成 ⇒ MIした各データセットでPVs生成
  • 欠測が少ない(5%未満)ならリストワイズでも可